procedure DDSlowlevel;
// Sinus nur auf unterem Byte ausgeben (-48dB)
begin
  asm;
   ; DDS, aus Zeitgrnden etwas geschachtelt
    ldi  _ACCA, $00
    mov  _ACCB, _ACCA
    mov  _ACCCLO, _ACCA ;Z-Pointer nullen
    mov  _ACCEHI, _ACCA ;Phasen-Akkumulator und Pointer 1. Kanal
    mov  _ACCELO, _ACCA ;Phasen-Akkumulator
    mov  _ACCFHI, _ACCA ;Phasen-Akkumulator und Pointer 2. Kanal
    mov  _ACCFLO, _ACCA ;Phasen-Akkumulator
    mov  _ACCDHI, _ACCA ; 1. Datenbyte
    mov  _ACCDLO, _ACCA ; 1. Datenbyte

    ldi  _ACCA, 01000010b;  // CTC, Toggle OC1 on Timer1
    out  TCCR0A, _ACCA;     // CTC, Toggle OC1 on Timer1
  DDSinitLooplowlevel:
    sbis TIFR0,1
    rjmp  DDSinitLooplowlevel ; auf Timer OCF0A warten
    sbi TIFR0,1           ; ... Timer OCF0A Flag lschen

  SinusGen.DDSlowlevelLoop1:
    sbis TIFR0,1
    rjmp  SinusGen.DDSlowlevelLoop1 ; auf Timer OCF0A warten
    sbi TIFR0,1          ; ... Timer OCF0A Flag lschen

    sbi PortB,5          ; I2S-Vorimpuls an
    ldi _ACCA, 01010000b ; SPI Einschaltwert laden
    cbi PortB,5          ; I2S-Vorimpuls aus
    out SPCR, _ACCA      ; SPI einschalten

    out SPDR, _ACCB      ; vorbereitetes MSB ausgeben, hier 0
    ; nchstes MSB berechnen
    add  _ACCELO, SinusGen.DDSL2 ; add value to DDS1 accumulator
    adc  _ACCEHI, SinusGen.DDSH2 ; variable Werte vom linken Kanal
    cpi  _ACCEHI, 192            ; berlauf nach 192 Sttzwerten
    brlo DDSlowlevelNoSub
    subi  _ACCEHI, 192
  DDSlowlevelNoSub:
    LDI  _ACCCHI, SinusGen.SinusWaveHi SHRB 8  ; oberes Byte Z-Register auf High-Tabelle
    mov  _ACCCLO,_ACCEHI  ; Z=Index fr Sinus-Tabelle
    LPM  _ACCDHI, Z       ; ... LSB in Data-Reg LO
  SPIwait1:
    in _ACCA, SPSR
    sbrs _ACCA,7 ; SPIF?
    rjmp SPIwait1;
    nop                   ; wg. Clock-Versatz ein NOP einfgen
    out SPDR, _ACCDHI
    ; nchstes LSB berechnen
    LDI  _ACCCHI, SinusGen.SinusWaveLow SHRB 8  ; oberes Byte Z-Register auf Low-Tabelle
    mov  _ACCCLO,_ACCEHI  ; Z=Index fr Sinus-Tabelle
    LPM  _ACCDLO, Z       ; ... LSB in Data-Reg LO
  SPIwait2:
    in _ACCA, SPSR
    sbrs _ACCA,7 ; SPIF?
    rjmp SPIwait2;

    ldi _ACCA, 0
    out SPCR, _ACCA ; SPI ausschalten
  ; 2. Kanal: letzte Werte einfach nochmal ausgeben
  SinusGen.DDSlowlevelLoop2:
    sbis TIFR0,1
    rjmp  SinusGen.DDSlowlevelLoop2 ; auf Timer OCF0A warten
    sbi TIFR0,1          ; ... Timer OCF0A Flag lschen

    sbi PortB,5          ; I2S-Vorimpuls an
    ldi _ACCA, 01010000b ; SPI Einschaltwert laden
    cbi PortB,5          ; I2S-Vorimpuls aus
    out SPCR, _ACCA      ; SPI einschalten

    out SPDR, _ACCB     ; altes MSB ausgeben
    ; nchstes MSB berechnen
  SPIlowlevelWait1:
    in _ACCA, SPSR
    sbrs _ACCA,7 ; SPIF?
    rjmp SPIlowlevelWait1;
    nop                  ; wg.  Clock-Versatz ein NOP einfgen
    out SPDR, _ACCDHI
  SPIlowlevelWait2:
    in _ACCA, SPSR       ; altes LSB ausgeben
    sbrs _ACCA,7 ; SPIF?
    rjmp SPIlowlevelWait2;

    ldi _ACCA, 0
    out SPCR, _ACCA ; SPI ausschalten

    LDS _ACCA, UCSRA
    sbrs _ACCA,7
    rjmp  SinusGen.DDSlowlevelLoop1; auf Receive warten
  endasm;
end;

